import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes";
import store  from "@/vuex/store"

//声明使用插件
Vue.use(VueRouter);

//重写push|replace
//拷贝VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace

//重写push|replace
//第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
//第二个参数：成功回调函数 第三个参数失败回调函数
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    //ca11||apply区别
    //相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    //不同点：cal1与apply传递参数：cal1传递参数用逗号隔开，apply方法执行，传递数组
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(
      this, //指定上下文
      location,
      () => {
        //自己设置的成功回调函数
      },
      () => {
        //自己设置的失败回调函数
      }
    );
  }
};
VueRouter.prototype.originReplace = function (location, resolve, reject) {
  if (resolve && reject) {
    //ca11||apply区别
    //相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    //不同点：cal1与apply传递参数：cal1传递参数用逗号隔开，apply方法执行，传递数组
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(
      this, //指定上下文
      location,
      () => {
        //自己设置的成功回调函数
      },
      () => {
        //自己设置的失败回调函数
      }
    );
  }
};

//向外默认暴露路由器对象
let router = new VueRouter({
  mode: "history", // 没有#的模式
  routes, // 注册所有路由
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    return { x: 0, y: 0 }
  },
});


//配置全局路由守卫
router.beforeEach(async (to,from,next) =>{
  //vuex仓库数据
  let token = store.state.user.token //用户一登录就有的
  let name = store.state.user.userInfo.name //要发请求才能获取
  //用户登录成功
  if(token){
    if(to.path == "/login"){
      next({path:"/"})
    }else{
      //判断是否有用户信息的name
      if(name){
        //有则放行
        next()
      }else{
        //没有则通过token去请服务器发请求
        try {
          //成功则获取用户信息
          await store.dispatch('getUserInfo')
          next()
        } catch (error) {
          //失败则清空token以及用户信息
          store.dispatch('reqLongOut')
          next({path:"/"})
        }
      }
    }
    
  }
  //用户未登录
  else{
    next()
  }
})

export default router;
